{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "ROC-curve.ipynb",
      "provenance": [],
      "collapsed_sections": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "oPUuSjJ96Au-",
        "colab_type": "text"
      },
      "source": [
        "# **Machine Learning in Python: Making Receiver Operating Characteristic (ROC) curve**\n",
        "\n",
        "Chanin Nantasenamat\n",
        "\n",
        "<i>Data Professor YouTube channel, http://youtube.com/dataprofessor </i>\n",
        "\n",
        "In this Jupyter notebook, we will be making a Receiver Operating Characteristic (ROC) curve using the Iris data set as an example."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "_SJy5TKvuF9s",
        "colab_type": "text"
      },
      "source": [
        "## **What is ROC curve?**\n",
        "\n",
        "The **ROC curve** summarizes the prediction performance of a classification model at all classification thresholds. Particularly, the ROC curve plots the **False Positive Rate (FPR)** on the *X-axis* and the **True Positive Rate (TPR)** on the *Y-axis*.\n",
        "\n",
        "$\\text{TPR (Sensitivity)} = \\frac{TP}{TP + FN}$\n",
        "\n",
        "$\\text{FPR (1 - Specificity)} = \\frac{FP}{TN + FP}$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "KwebBKbP3Vsx",
        "colab_type": "text"
      },
      "source": [
        "## **Generate synthetic dataset**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ECJbWdcw5JMu",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from sklearn.datasets import make_classification\n",
        "import numpy as np"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Wl9Gu5Ba1d1X",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "X, Y = make_classification(n_samples=2000, n_classes=2, n_features=10, random_state=0)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "eqZsiSMtrdm9",
        "colab_type": "text"
      },
      "source": [
        "## **Add noisy features to make the problem more difficult** $^1$\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "r9otz_41rPXH",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "random_state = np.random.RandomState(0)\n",
        "n_samples, n_features = X.shape\n",
        "X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "nAw93CgK4178",
        "colab_type": "text"
      },
      "source": [
        "## **Data splitting**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "NRmlzFOA4x9Z",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from sklearn.model_selection import train_test_split"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "yTep82KV9axn",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=.2,\n",
        "                                                    random_state=0)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "V_MvToES4n_A",
        "colab_type": "text"
      },
      "source": [
        "## **Build classification model**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Fo9Xk5T94v6j",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from sklearn.ensemble import RandomForestClassifier\n",
        "from sklearn.naive_bayes import GaussianNB"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "0C3NRujmed_j",
        "colab_type": "text"
      },
      "source": [
        "### Random Forest"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "5WQ8UFXe9Zmx",
        "colab_type": "code",
        "outputId": "59d40193-4955-4ef9-89e5-c258b82e0608",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 153
        }
      },
      "source": [
        "rf = RandomForestClassifier(max_features=5, n_estimators=500)\n",
        "rf.fit(X_train, Y_train)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,\n",
              "                       criterion='gini', max_depth=None, max_features=5,\n",
              "                       max_leaf_nodes=None, max_samples=None,\n",
              "                       min_impurity_decrease=0.0, min_impurity_split=None,\n",
              "                       min_samples_leaf=1, min_samples_split=2,\n",
              "                       min_weight_fraction_leaf=0.0, n_estimators=500,\n",
              "                       n_jobs=None, oob_score=False, random_state=None,\n",
              "                       verbose=0, warm_start=False)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 7
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Aw_Ax0cne2BC",
        "colab_type": "text"
      },
      "source": [
        "### Naive Bayes"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "nxmFVCs-e9Mz",
        "colab_type": "code",
        "outputId": "6d8621b3-555e-41b7-c219-bd7c2118c0b7",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "source": [
        "nb = GaussianNB()\n",
        "nb.fit(X_train, Y_train)"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "GaussianNB(priors=None, var_smoothing=1e-09)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 8
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "hl_hDOsvDmyV",
        "colab_type": "text"
      },
      "source": [
        "## **Prediction probabilities** $^2$"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "jVkSSnnGCQ0O",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "r_probs = [0 for _ in range(len(Y_test))]\n",
        "rf_probs = rf.predict_proba(X_test)\n",
        "nb_probs = nb.predict_proba(X_test)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "GNha6VVeDsyb",
        "colab_type": "text"
      },
      "source": [
        "Probabilities for the positive outcome is kept."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "a4j8EtvZCdF8",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "rf_probs = rf_probs[:, 1]\n",
        "nb_probs = nb_probs[:, 1]"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "rf9gjJcb4i0e",
        "colab_type": "text"
      },
      "source": [
        "## **Computing AUROC and ROC curve values**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "cSfzTGWn4lXe",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from sklearn.metrics import roc_curve, roc_auc_score"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gpr5ON6QC7ip",
        "colab_type": "text"
      },
      "source": [
        "### **Calculate AUROC**\n",
        "**ROC** is the receiver operating characteristic\n",
        "**AUROC** is the area under the ROC curve"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "yVwjOC6XC5lw",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "r_auc = roc_auc_score(Y_test, r_probs)\n",
        "rf_auc = roc_auc_score(Y_test, rf_probs)\n",
        "nb_auc = roc_auc_score(Y_test, nb_probs)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "TIzyhgstDMqw",
        "colab_type": "text"
      },
      "source": [
        "### **Print AUROC scores**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "lUvZ8_BbC5uf",
        "colab_type": "code",
        "outputId": "f7012c23-bfd5-4933-8a8c-49fa0c9931ed",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 68
        }
      },
      "source": [
        "print('Random (chance) Prediction: AUROC = %.3f' % (r_auc))\n",
        "print('Random Forest: AUROC = %.3f' % (rf_auc))\n",
        "print('Naive Bayes: AUROC = %.3f' % (nb_auc))"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Random (chance) Prediction: AUROC = 0.500\n",
            "Random Forest: AUROC = 0.941\n",
            "Naive Bayes: AUROC = 0.993\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "7AsuB3AQE5FC",
        "colab_type": "text"
      },
      "source": [
        "### **Calculate ROC curve**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "lApmrHMp9YDb",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "r_fpr, r_tpr, _ = roc_curve(Y_test, r_probs)\n",
        "rf_fpr, rf_tpr, _ = roc_curve(Y_test, rf_probs)\n",
        "nb_fpr, nb_tpr, _ = roc_curve(Y_test, nb_probs)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "tXpx2YMM4Gsb",
        "colab_type": "text"
      },
      "source": [
        "## **Plot the ROC curve**"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "oL96kXed4MvL",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "import matplotlib.pyplot as plt"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "v2Q6p9qmFVxB",
        "colab_type": "code",
        "outputId": "99d38f38-6f9c-41bb-aadb-98f428720982",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 295
        }
      },
      "source": [
        "\n",
        "plt.plot(r_fpr, r_tpr, linestyle='--', label='Random prediction (AUROC = %0.3f)' % r_auc)\n",
        "plt.plot(rf_fpr, rf_tpr, marker='.', label='Random Forest (AUROC = %0.3f)' % rf_auc)\n",
        "plt.plot(nb_fpr, nb_tpr, marker='.', label='Naive Bayes (AUROC = %0.3f)' % nb_auc)\n",
        "\n",
        "# Title\n",
        "plt.title('ROC Plot')\n",
        "# Axis labels\n",
        "plt.xlabel('False Positive Rate')\n",
        "plt.ylabel('True Positive Rate')\n",
        "# Show legend\n",
        "plt.legend() # \n",
        "# Show plot\n",
        "plt.show()"
      ],
      "execution_count": 0,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nuMjvm91PP/3Eo48+StWqVfHw8MDT05Pduy0/t/z0008MHz4cpRR33HEH165dIzo6mvXr19O3b1/q\n1atH3bp16du3L7/88gsAgwcPZvHixcWKO4tVS0xorddprVtrrVtprd83rXtTa73K9PwurXVDrXWA\n6WdwwUe8PatOrDJKSwCpOp1VNaoZL5TjonPaVA7Cv1ltHunUnF/H9aRv24Y2jqp8yMjI4Pfff2fw\nYOO/m4+PD1u3bmXv3r288847vPbaa+Ztw8LCWLJkCeHh4SxZsoSzZ88SHR3NW2+9xfbt29m2bRsH\nD94cEf1///d/jBgxgv379zNs2DDGjBljfu3q1avs3LmTadOmMXjwYMaNG0dERATh4eHmJoLcateu\nTXh4OKNHj+Zf//qXeX1UVBQ7duxg6tSpjBo1is8++4w9e/bwySef8MILLwAwduxYnn/+ecLDw2nc\nuHGex589ezaRkZGEhYXliLlJkyZs3LiRjRs35th+z549zJ8/nz///JNdu3YxZ84c9u7dC8CxY8d4\n8cUXiYiIoE6dOixbtuyW99u+fTsdO3Y0LycnJ7NhwwYGDRrEY489dlsntjNnzpCcnIy/vz8AERER\nOd4DICgoiIiICI4fP46bmxu1atUq9Ljjxo0zN+Fk/5kyZcot2547d47mzW+2hDdr1sz8RSO3SZMm\n4e/vz7hx40hJSSlw/4KOW7duXVJSUoiNjS30dylMmegstjaFyrVsyn+OVcrdqKEbyWlM+fkwVSs5\n8uagtgS51yPIvfwViVvyzy75vuZUxbHA1+vVqFLg6/lJSkoiICCAc+fO0aZNG/r27QtAXFwcI0aM\n4NixYyilSEtLM+/Tp08fatc25qG0bduW06dPc/nyZUJCQnB1dQXgkUce4ejRowDs3LmT5cuXA/Dk\nk0/muIoYNGgQSin8/Pxo2LAhfn5+ALRr147IyEgCAgJuifmxxx4zP44bN868/qGHHsLR0ZH4+Hh2\n7NjBQw89ZH4t6+Syfft288n4ySefZMKECbccf8OGDTz33HPmb+j16hX8f2nbtm0MGTKEGjWMYchD\nhw5l69atDB482Nz2DdCxY0ciIyNv2T86Opo2bdqYl9esWUOvXr1wcnLigQce4N1332X69Ok4Ojrm\nOfol+7olS5awZcsWDh8+zOeff061atUKjL2ocvc7lIQPP/yQRo0akZqayqhRo/joo4948803b/t4\n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\netOm1QN51gAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "KjKvljmy5O25",
        "colab_type": "text"
      },
      "source": [
        "## **Reference**\n",
        "1. https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html\n",
        "2. https://machinelearningmastery.com/roc-curves-and-precision-recall-curves-for-classification-in-python/\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "qen82yXu_VFw",
        "colab_type": "text"
      },
      "source": [
        "---"
      ]
    }
  ]
}